<?php

class AlipayController extends Controller
{

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout='//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
            'postOnly + delete', // we only allow deletion via POST request
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array( 
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions'=>array('notify_url','return_url','index'),
                'users'=>array('@'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    
    public function actionIndex(){
        header("Content-Type: text/html; charset=utf-8");
        //echo Yii::app()->getBaseUrl();exit;
        require(dirname(Yii::app()->BasePath)."/alipay/alipay.config.php");
        require(dirname(Yii::app()->BasePath)."/alipay/lib/alipay_submit.class.php");

             $company=Company::model()->find('id=:id',array(':id'=>Yii::app()->user->id));

             /**************************请求参数**************************/ 
            //支付类型
            $payment_type = "1";
            //必填，不能修改
            //服务器异步通知页面路径
            //$notify_url = Yii::app()->params['returnHost']."alipay/notify_url.html";
            $notify_url = Yii::app()->request->hostInfo.Yii::app()->createUrl("alipay/notify_url");
            //需http://格式的完整路径，不允许加?id=123这类自定义参数
            //页面跳转同步通知页面路径
            $return_url = Yii::app()->request->hostInfo.Yii::app()->createUrl("alipay/return_url");
            //需http://格式的完整路径，不允许加?id=123这类自定义参数 
            if(empty($_GET['id'])){
                   //必填 
                //商户订单号
                $out_trade_no = time().$company->id;
                //商户网站订单系统中唯一订单号，必填

                //订单名称
                $subject = '短信充值';
                //必填

                //付款金额
                // $total_fee = $_POST['totalfee'];
                $total_fee =(Yii::app()->params['env'] == 'main')?$_POST['totalfee']:'1';
                //必填 
                //订单描述 
                $body = '[短信充值]'.$company->title.'充值'.$total_fee.'元';
            }else{
                $smsorder = Smsorders::model()->findByPk($_GET['id']);
                 //商户订单号
                $out_trade_no = $smsorder->orderno;
                //商户网站订单系统中唯一订单号，必填

                //订单名称
                $subject = $smsorder->subject;
                //必填 
                //付款金额
                // $total_fee = $_POST['totalfee'];
                $total_fee =(Yii::app()->params['env'] == 'main')?$smsorder->totalfee:'1';
                //必填 
                //订单描述 
                $body =  $smsorder->orderbody;
            }
            //商品展示地址
            $show_url = "";
            //需以http://开头的完整路径，例如：http://www.xxx.com/myorder.html

            //防钓鱼时间戳
            $anti_phishing_key = "";
            //若要使用请调用类文件submit中的query_timestamp函数

            //客户端的IP地址
            $exter_invoke_ip = "";
            //非局域网的外网IP地址，如：221.0.0.1 
            
    /************************************************************/
        //构造要请求的参数数组，无需改动
        $parameter = array(
                "service" => "create_direct_pay_by_user",
                "partner" => trim($alipay_config['partner']),
                "payment_type"  => $payment_type,
                "notify_url"    => $notify_url,
                "return_url"    => $return_url,
                "seller_email"  => trim($alipay_config['seller_email']),
                "out_trade_no"  => $out_trade_no,
                "subject"   => $subject,
                "total_fee" => $total_fee,
                "body"  => $body,
                "show_url"  => $show_url,
                "anti_phishing_key" => $anti_phishing_key,
                "exter_invoke_ip"   => $exter_invoke_ip,
                "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
        );
       // 建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
        echo '<style>#alipaysubmit{display:none;}</style>'.$html_text;

        if(empty($_GET['id'])){
            $smsorders=new Smsorders();
            $smsorders->companyid=$company->id;
            $smsorders->orderno=$out_trade_no ;
            $smsorders->totalfee=$total_fee;
            $smsorders->subject=$subject;
            $smsorders->orderbody=$body;
            $smsorders->status='支付中';
            $smsorders->smscount=(Yii::app()->params['env'] == 'main')?Company::model()->getSmsCount($total_fee):'1000'; 
            // $smsorders->smscount='1000'; 
            $smsorders->save(false);  
        }
      

    }
    
    public function actionNotify_url(){
        /* */
        require(dirname(Yii::app()->BasePath)."/alipay/alipay.config.php");
        require(dirname(Yii::app()->BasePath)."/alipay/lib/alipay_notify.class.php");

        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代

            //Order::model()->updateAll(array('pay'=> 1),"order_number=".$_POST['out_trade_no']);
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号
            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];


            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                    //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                    //如果有做过处理，不执行商户的业务程序

                //注意：
                //该种交易状态只在两种情况下出现
                //1、开通了普通即时到账，买家付款成功后。
                //2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                    //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                    //如果有做过处理，不执行商户的业务程序

                //注意：
                //该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
                $smsorders=Smsorders::model()->find('orderno=:orderno',array(':orderno'=> $out_trade_no));
                if(!empty( $smsorders)){
                    if($smsorders->status=='支付中'){
                        $smsorders->status='已支付';
                        $smsorders->save();

                        $company=Company::model()->find('id=:id',array(':id'=>$smsorders->companyid)); 
                        $company->point= intval($company->point)+intval($smsorders->smscount); 
                        $company->save(false);
                    }
                }
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";     //请不要修改或删除

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
         // echo "<script language='JavaScript'>window.open('about:blank','_self').close() ;</script>";
        /*     */
    }
    public function actionReturn_url(){
        /*  */
        require(dirname(Yii::app()->BasePath)."/alipay/alipay.config.php");
        require(dirname(Yii::app()->BasePath)."/alipay/lib/alipay_notify.class.php");


        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn(); 

        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码
            // Order::model()->updateAll(array('pay'=> 1),"order_number=".$_GET['out_trade_no']);
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
            
            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];

            //支付宝交易号
            $trade_no = $_GET['trade_no'];

            //交易状态
            $trade_status = $_GET['trade_status'];


            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
                
                 $smsorders=Smsorders::model()->find('orderno=:orderno',array(':orderno'=> $out_trade_no));
                if(!empty( $smsorders)){
                    if($smsorders->status=='支付中'){
                        $smsorders->status='已支付';
                        $smsorders->save();

                        $company=Company::model()->find('id=:id',array(':id'=>$smsorders->companyid)); 
                        $company->point= intval($company->point)+intval($smsorders->smscount); 
                        $company->save(false);
                    }
                }
            }
            else {
              echo "trade_status=".$_GET['trade_status'];
            }
            header("Content-Type: text/html; charset=utf-8");
            echo "验证成功<br />"; 
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            header("Content-Type: text/html; charset=utf-8");
            echo "验证失败"; 
        }
        /*  */
        echo "<script language='JavaScript'>window.open('about:blank','_self').close() ;</script>";
    }
    
}

